#pragma rtGlobals=1 // Use modern global access method. #pragma version = 1.0 ///////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////// //*********************************************************************************// //* PL実験データをいっぺんに読み込むプログラム *// //* そして…RAMANのデータもごっそり読み込めるプログラムに拡張 *// //* 2003.10.31改 *// //*********************************************************************************// ///////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////// //ver履歴 // 2003.04.14 ver.0 たたき台完成 // 2003.04.24 ver.0.1 ユーザーキャンセルエラーを修正 // 読み込む度にTableを新しく作成するように修正 // フォルダ内にフォルダがあってもうまくいくように修正 // フォルダ内に「.prn」ファイルがあってもスキップするように修正 // 2003.10.31 ver.1.0 RAMANデータ(ただしRAMANのPC上のWinSpecで一括変換したものについてのみ) // も読み込めるように修正。使用関数変更で高速化を実現。 // //********************************************************************************************* //特徴: ■readPLdata_folderマクロ // フォルダを選択させ、添え字を指定 // ラマンのPCで変換した時に作成される「,1,」のゴミを除去 // ファイル名に添え字をつけたウェーブを自動作成 // テーブル作成 // ■readPLdata_fileマクロ // 「.prn」ファイル1つを読み込む。あとは上記と変わらない // ■readRAMAN_folderマクロ // フォルダごとごっそり読み込む。ラマンのPCで変換したデータのみ対応。 // // //注意: ■必ずラマンのPCで変換したPLのデータの入ったフォルダを指定すること //  それ以外のファイルフォーマットに対応していない // 例:「557.543,1,102」のような3列データ。 // 特に中央の「,1,」がないとうまくいかない // ■HD内のフォルダを指定しよう。外部メディアからの読み込みは非常に遅い // // 以下の問題は解決されました。 // // ■フォルダ内にフォルダがあってはいけない // ┌―――――――――――――――――――――――――――――――――――――― // │→ver.0.1にて修正。ただし、さらに下の階層のフォルダの中のファイルは読まない // └─――――――――――――――――――――――――――――――――――――― // ■フォルダ内に「.prn」以外のファイルがあってもうまくいかない // ┌―――――――――― // │→ver.0.1にて修正。 // └─――――――――― // ■一度、マクロを実行したら、出力されたテーブルの名称を変更すること //  デフォルトで、テーブル名「Tabl」に作成されることになっている // ┌―――――――――――――――――――――――――――――――――― // │→ver.0.1にて修正。読み込むたびに新しくテーブルは作成されていく // └─――――――――――――――――――――――――――――――――― // ■ポイント数が1100個のデータのみに対応。PL実験データのみ。 // ┌―――――――――――――――――――――――――――――――――― // │→ver.1.0にて修正。理論上3000ポイントまでのデータを読み込み可能 // └─――――――――――――――――――――――――――――――――― //問題点 // ■例えば2回目の読み込みを実行するとき、 //  1回目の読み込みと、同じファイル名が存在した場合、 //  あっさり上書きされてしまう。 // ■3列データにのみ対応している。同じ、「.prn」ファイルなのに //  2列データ、混合データを読み込むことはできない。 // //********************************************************************************************* macro readPLdata_folder() variable oo //適当な戻り値 variable/G vc=0 //PLデータですよ。2003.10.31追加! //フォルダ内のファイルすべてを読み込む oo=select_folder(vc) endmacro ////////////////////////////////////////////////////////////////////// //2003.10.31追加! macro readRAMAN_folder() variable vb variable/G vc=1 //RAMANデータですよ。2003.10.31追加! vc=1 vb=select_folder(vc) endmacro ///////////////////////////////////////////////////////////////////// function select_folder(ch) variable ch //0・・・PL、1…RAMAN string flist //ファイルリスト(例:"aaaa.prn;bbb.prn;ccc.prn;") //フォルダの選択ダイアログの表示 newpath/O mypath //".prn"ファイルのあるフォルダのパス名を保存(シンボリックパスとして) //ユーザーがキャンセルしたときの操作分岐 if(V_flag==0) //newpath操作がうまくいったとき↓ //フォルダ内にあるファイル名リストを取得 flist=IndexedFile(mypath,-1,".prn") if( strlen(flist) == 0 ) //flistが""(空っぽ)の時、スキップする printf "ファイル名’.prn’のファイルを見つけることができませんでした。\r" else edit //テーブルの作成 PathInfo mypath //シンボリックパスの情報を獲得 //次の操作へ variable var9 var9=select_folder2(flist,S_path,ch) //ファイルリストとファルダのフルパス名を渡す endif else //newpath操作がうまくいかなかったとき↓ printf "error:ユーザーによりキャンセルされました。\r" endif end function select_folder2(flis2,ffpath,ct) string flis2 //ファイルリスト string ffpath //フォルダのフルパス名 variable ct //0・・・PL、1…RAMAN string fna //抽出したファイル名を一時保存 string file_fpath //ファイルのフルパスを一時保存 string str3 //適当な戻り値の保存先 variable var3 //適当な戻り値 //////////////////// //2003.10.31追加 string texv,texu if(ct==0) texv="_wavelength" texu="_int" endif if(ct==1) texv="_cm" texu="_int" endif //////////////////// // This is necessary because you can't pass an & parameter to Prompt. String xxx = texv String yyy = texu Variable zzz //= createTable Prompt xxx,"X軸データのウェーブ名を「ファイル名+添え字」にします。添え字を入力:" Prompt yyy,"Y軸データのウェーブ名を「ファイル名+添え字」にします。添え字を入力:" Prompt zzz, "テーブルを作成しますか?この作業は恐ろしく時間がかかります。(〜10s)", popup "Yes;No" DoPrompt "「.prn」ファイルの読み込み。注意:データ形式が3列のもののみ有効", xxx, yyy, zzz variable j1=0 //この関数の戻り値。ファイル総数もしくは、「=-1」のとき、キャンセルを意味する //ユーザーが「キャンセル」をクリックしたかどうか調べる variable var8 var8=V_flag if(var8==1) //「キャンセル」が押された場合 printf "error:ユーザーによりキャンセルされました。\r" j1=-1 //tablを消すためのパラメータ(戻り値)を設定 else //以下、作業づづく↓ variable j=0 //ファイル番号をカウント&記憶 variable i=0 //do-while文から抜け出すためのパラメータ do fna=stringfromlist(j,flis2) if(strlen(fna) == 0) i=1 //fnaが「nul値」のときループから抜け出す else //ファイルのフルパス名を作成 file_fpath=ffpath+fna //ファイルを開いて情報を取得→ウェーブ2つ作成→表に追加 str3=readF(file_fpath,xxx,yyy,zzz,ct) j=j+1 endif while(i==0) //開いたファイル数をプリント printf "%g個のファイルを開きました。\r",j j1=j endif return j1 end //************************************************************************** //************************************************************************** //ひとつのファイルを選択して開く //************************************************************************** macro readPLdata_file() Variable refNum,var0 String fileName,str,str2 variable var7 //test open/d/r/M="ファイルを開く。PL実験データ(3列)の「.prn」ファイルを指定" refNum as fileName //ユーザーが「キャンセル」を押した場合 var7=strlen(S_fileName) if(var7==0) printf "error:ユーザーによりキャンセルされました。\r" //ユーザーが「開く」を押した場合↓ else //フルパス名を保存 String fuPath = S_fileName //拡張子が「*****.prn」で終わっている場合↓ if(stringmatch(fuPath[strlen(fuPath)-3,strlen(fuPath)],"prn")==1) //フルパス名を表示 Printf "次のデータを読み込み \"%s\"\r", fuPath //print strlen(fullPath) //フルパス名からファイル名を抜き取り fileName=getFname(S_fileName) //ファイル名を表示 printf "ファイル名:\"%s\"\r", fileName //添え字の入力→ファイル読み込みへ。 var0=input_xx(fileName,fuPath) else //拡張子が「*****.prn」で終わっていない場合↓ printf "error:拡張子が「.prn」以外です。\r" endif endif endmacro function input_xx(fnam,ful_Path) //ファイル名(拡張子を除く)に続く、添え字を入力してもらう関数 string fnam string ful_Path string strr String xName2 = "_wavelength" String yName2 = "_intencity" Variable createTable2 //= createTable Prompt xName2,"X軸データのウェーブ名を「ファイル名+添え字」にします。添え字を入力:" Prompt yName2,"Y軸データのウェーブ名を「ファイル名+添え字」にします。添え字を入力:" Prompt createTable2, "テーブルを作成しますか?", popup "Yes;No" DoPrompt "Enter wave names", xName2, yName2, createTable2 //「キャンセル」の判断 //ユーザーが「キャンセル」をクリックしたかどうか調べる variable var4 var4=V_flag if(var4==1) //「キャンセル」が押された場合 printf "error:ユーザーによりキャンセルされました。\r" else //テーブルの作成 if(createTable2==1) edit endif //ファイル内容をよみとる。 strr=readF(ful_Path,xName2,yName2,createTable2,0) // strr=renm(fnam,xName2,yName2,createTable2) endif end //***************************************************************************** function/S readF(fpath,xst,yst,crtTable,cz) //フルパスからファイル内容を読み取り String fpath //フルパス名 string xst //xデータ、ウェーブ名につける添え字 string yst //yデータ、ウェーブ名につける添え字 variable crtTable //テーブル作成を行うか(yes,no) variable cz //0・・・PL、1…RAMAN Variable refNum String fileName,str open/r refNum as fpath //現在の位置取得、ファイルのバイト合計数取得 FStatus refNum //拡張子前のファイル名取得 string ffname ffname=removef(S_fileName) //拡張子除去 /////////////////////////////////////////////////////////////////// //ポイント数i0、ウエーブ名(ファイル名+"_a"or"_c")のウェーブを作成 //ファイル名+"_a"or"_c"のウエーブを作成する string sa,sc sa=ffname+xst //xウェーブの名称 sc=ffname+yst //yウェーブの名称 ///////////////////////////////////////////////// //2003.11.2変更(3000ポイントのウェーブを最初に作成して、あとで、ポイントを削る) make/D/O/N=3000 $sa,$sc //テーブルに列を追加する場合 if(crtTable==1) AppendToTable $sa,$sc endif ///////////////////////////////////////////////////// //1行づづ読み取り、str→数値変換後、ウェーブに代入 Variable firstChar Variable ii=1 do //一行読み取り FreadLine refNum,str //ファイルの終端かどうか調べる。///////2003.11.2///////////////////////////////////////// if (strlen(str) == 0) break // End of file  『』←空白の改行はファイルの最後とする endif firstChar = char2num(str[0]) if ( (firstChar==10) || (firstChar==13) ) break // Hit blank line. End of data in the file. //『』←もしかしたら、「LF」「CR」があるかも知れない。 endif ///////////////////////////////////////////////////////////////////////////////////////// //行データより、「,」で分けられたデータの分割作業&読み込み work1(ii,str,ffname,xst,yst) /////////////////////////////////////////// //ファイルステータスの取得 //FStatus refNum (←2003.11.2もう必要なくなった。上のbreakでループ脱出) ii=ii+1 //while(V_logEOF!=V_filePos) (←2003.11.2もう必要なくなった。上のbreakでループ脱出) while(1) //ファイルを閉じる close refNum /////////////////////////////////////////////// //[2003.11.2追加] 残りの不必要なポイントを消す DeletePoints ii-1,(3000-ii+1), $sa,$sc //適当な文字列を返す return ffname end function/S work1(pt,st,fname,xs,ys) //行データより、「,」で分けられたデータの分割 variable pt //ポイント番号 String st //行データ String fname //ファイル名 string xs //xの添え字 string ys //yの添え字 String sa,sb,sc //1列目、2列目、3列目の文字データ Variable da,db,dc //1列目、2列目、3列目の数値データ Variable na,nb,nc //文字列におけるポジション //na,ab,acに分割でーたをストック na=0 nb=strsearch(st,",",na) sa=st[0,nb-1] nc=strsearch(st,",",nb+1) sb= st[nb+1,nc-1] sc=st[nc+1,strlen(st)-2] //printf "%s,%s,%s\r",sa,sb,sc //数値でーたに変換 //sscanf sa, "%f", na na=str2num(sa) nb=str2num(sb) nc=str2num(sc) //print na,nb,nc //ウェーブに代入 string wa,wb,wc wa=fname+xs wb=fname+"_b" wc=fname+ys wave w1=$wa //wave w2=$wb wave w3=$wc w1[pt-1]=na //w2[pt-1]=nb w3[pt-1]=nc end //********************************************************** //未使用 //********************************************************** function/S renm(ss,sx,sy,si) //添え字の変更を施す操作 string ss //ファイル名 String sx = "_wavelength" //X軸データの添え字 String sy = "_intencity" //Y軸データの添え字 Variable si //= createTable //リネイム作業 string oldsx,oldsy sx=ss+sx sy=ss+sy oldsx=ss+"_a" oldsy=ss+"_c" //wave newx=$sx //wave newy=$sy wave oldx=$oldsx wave oldy=$oldsy rename oldx,$sx rename oldy,$sy return ss end //************************************************************************* //未使用 //**************************************************** function dell2(str4) //中央の「,1,」データの削除 string str4 //ファイルネーム string ffn ffn=removef(str4)+"_b" //print ffn RemoveFromTable $ffn KillWaves $ffn end //************************************************************************** function/S removef(str) string str //ファイル名から拡張子を除く Variable na,nb na=0 nb=strsearch(str,".",na) return str[0,nb-1-2] //「_1.」を削除 end //************************************************************************** //*************************************************************************** function/S getFname(fullPath) //フルパスからファイル名(拡張子付き)のみを抽出 string fullPath variable tempNa,NN,tempNN,tempNb,outName NN=0 tempNN=0 do tempNb=tempNa tempNa=strsearch(fullPath,":",NN+1) NN=tempNa tempNN=tempNN+1 //print tempNa,tempNN while (tempNa>0) //print tempNb return fullPath[tempNb+1,strlen(fullPath)] end //****************************************************************************